home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1994-01-04 | 5.6 KB | 124 lines |
- DEFINITION MODULE jump;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* (Kontrollierte) globale Spruenge *)
- (* --------------------------------------------------------------------------*)
- (* 01-Jan-94, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM PORTAB IMPORT
- (* TYPE *) UNSIGNEDLONG, UNSIGNEDWORD;
-
- #ifdef TSM2_1
- FROM AsmLib IMPORT LongLabel;
- #endif
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- #ifdef TSM2_1
- TYPE JmpBuf = LongLabel;
- #else
- TYPE
- JmpBuf = RECORD
- #if (defined LPRM2) || (defined SPCM2)
- regs : ARRAY [0..4] OF UNSIGNEDLONG; (* PC & A4-A7 *)
- #elif (defined MM2)
- regs : ARRAY [0..10] OF UNSIGNEDLONG; (* PC & D3-D7/A3-A7 *)
- #elif (defined HM2)
- regs : ARRAY [0..12] OF UNSIGNEDLONG; (* PC & D2-D7/A2-A7 *)
- #elif (defined TDIM2)
- regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A5-A7 *)
- #elif (defined FTLM2)
- regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A3/A6/A7 *)
- #else
- # error *** compiler not (yet) supported
- #endif
- END;
- #endif /* TSM2 */
-
-
- TYPE
- SigJmpBuf = RECORD
- #if (defined LPRM2) || (defined SPCM2)
- regs : ARRAY [0..4] OF UNSIGNEDLONG; (* PC & A4-A7 *)
- #elif (defined MM2)
- regs : ARRAY [0..10] OF UNSIGNEDLONG; (* PC & D3-D7/A3-A7 *)
- #elif (defined HM2)
- regs : ARRAY [0..12] OF UNSIGNEDLONG; (* PC & D2-D7/A2-A7 *)
- #elif (defined TDIM2)
- regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A5-A7 *)
- #elif (defined FTLM2)
- regs : ARRAY [0..3] OF UNSIGNEDLONG; (* PC & A3/A6/A7 *)
- #else
- # error *** compiler not (yet) supported
- #endif
- procmask : UNSIGNEDLONG;
- saved : UNSIGNEDWORD;
- END;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE setjmp ((* -- /AUS *) VAR env : JmpBuf ): INTEGER;
-
- PROCEDURE longjmp ((* EIN/ -- *) VAR env : JmpBuf;
- (* EIN/ -- *) val : INTEGER );
-
- (*--------------------------------------------------------------------------
- | Mit diesen beiden Funktionen lassen sich GOTOs realisieren, die z.B. fuer|
- | die Fehlerbehandlung nuetzlich sein koennen. Wenn "setjmp()" zum ersten |
- | Mal aufgerufen wird, werden in <env> die Inhalte der Prozessorregister |
- | gespeichert, die benoetigt werden, um wie nach einem Prozeduraufruf in |
- | der Abarbeitung des Programms fortzufahren; als Funktionswert wird eine |
- | Null geliefert. Wird jetzt im weiteren Verlauf "longjmp()" mit dem durch |
- | "setjmp()" in <env> gesicherten Kontext aufgerufen, wird die Programmaus-|
- | fuehrung direkt hinter dem zugehoerigen "setjmp()" fortgesetzt, nur das |
- | als Funktionswert von "setjmp()" jetzt nicht Null, sondern <val> gelie- |
- | fert wird. Falls <val> ebenfalls Null ist, wird es auf eins korrigiert, |
- | um auf jeden Fall eine Unterscheidung zum ersten Aufruf von "setjmp()" zu|
- | ermoeglichen. |
- | "setjmp()" sollte nur in einer Zuweisung oder innerhalb eines einfachen |
- | Vergleichs aufgerufen werden. |
- | Der ``Block'', in dem "setjmp()" aufgerufen wurde, darf noch nicht ver- |
- | lassen worden sein, wenn durch "longjmp()" in diesen zurueckgesprungen |
- | wird. Mit Block sind dabei alle Konstrukte gemeint, die Platz auf dem |
- | Stack benoetigen, da Werte auf dem Stack nach Verlassen des Blocks mit |
- | ziemlicher Sicherheit wieder ueberschrieben werden. Somit darf vor allem |
- | nicht in eine Prozedur zurueckgesprungen werden, die bereits verlassen |
- | wurde, aber z.B. auch nicht in eine bereits verlassene FOR-Schleife (da |
- | hier evtl. der Schleifenendwert auf dem Stack abgelegt wird) oder eine |
- | WITH-Anweisung (Sichern von (Address)Registern). |
- | "longjmp()" darf nicht zum Verlassen eines Signalhandlers benutzt werden.|
- | |
- | GEMDOS/MiNT: |
- | Beim Aufruf von "longjmp()" muss sich die CPU im gleichen Modus |
- | befinden wie beim Aufruf des dazugehoerenden "setjmp()". |
- | MiNT: Bei "longjmp()" wird ein 'Psigreturn' ausgefuehrt. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE sigsetjmp ((* -- /AUS *) VAR env : SigJmpBuf;
- (* EIN/ -- *) savemask : UNSIGNEDWORD ): INTEGER;
-
- PROCEDURE siglongjmp ((* EIN/ -- *) VAR env : SigJmpBuf;
- (* EIN/ -- *) val : INTEGER );
-
- (*--------------------------------------------------------------------------
- | Funktion wie "lib.set/longjmp()", jedoch wird, falls <savemask> <> 0, |
- | die Signalmaske des Prozesses beim Aufruf von "sigsetjmp()" gerettet und |
- | bei "siglongjmp()" wieder restauriert. |
- | |
- | GEMDOS: (noch) nicht implementiert |
- | MiNT: -""- |
- --------------------------------------------------------------------------*)
-
- END jump.
-